﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GmFamilyService.h"
#include <string>

namespace gfam
{
    /// \brief 在产品进程中启用并初始化多进程族服务框架
    /// 
    /// \param processPath 族服务进程的路径
    /// \param minProcessCount 最小进程数，初始化框架时启动的族服务进程个数
    /// \param maxProcessCount 最大进程数，这个值会直接影响框架的并行处理能力
    /// \return 是否成功
    bool GM_FAMILY_SERVICE_EXPORT InitMultiProcessFamilyServiceMaster(const std::wstring& processPath, int minProcessCount = 4, int maxProcessCount = 8);
    
    /// \brief 在族服务进程中启用并初始化多进程族服务框架，产品进程不需要调用
    /// 
    /// \return 是否成功
    bool GM_FAMILY_SERVICE_EXPORT InitMultiProcessFamilyServiceWorker();

    /// \brief 异步接口，向族服务框架中载入族文件；该方法是线程安全的，在主线程和工作线程中均可调用
    /// \brief 注意事项：
    /// \brief        1、deletable如果设置为false,则被载入的族文件则不会随着文档的关闭而释放，它将占用着族服务进程的资源直到整个应用程序关闭，
    /// \brief           所以不要对同一个路径的族文件做重复载入，这将浪费族服务较大的内存资源。
    /// 
    /// \param familyServiceUid 该族文件对应族服务的Uid, 外部可以随机生成传入
    /// \param familyFilePath 族文件路径
    /// \param isParentDocumentNested 族文件所处文档是否是顶层
    /// \param deletable 族文件被载入后是否可被删除，当值为false时，即使调用DestroyFamilyService方法也不会删除该文件对应的族服务对象
    /// \return 返回是否成功
    bool GM_FAMILY_SERVICE_EXPORT LoadFamilyFileAsync(const std::wstring& familyServiceUid, const std::wstring& familyFilePath, bool isParentDocumentNested = false, bool deletable = true);

    /// \brief 同步接口，向族服务框架中载入族文件；该方法是线程安全的，在主线程和工作线程中均可调用
    /// \brief 注意事项：
    /// \brief        1、deletable如果设置为false,则被载入的族文件则不会随着文档的关闭而释放，它将占用着族服务进程的资源直到整个应用程序关闭，
    /// \brief           所以不要对同一个路径的族文件做重复载入，这将浪费族服务较大的内存资源。
    /// 
    /// \param familyServiceUid 该族文件对应族服务的Uid, 外部可以随机生成传入
    /// \param familyFilePath 族文件路径
    /// \param isParentDocumentNested 族文件所处文档是否是顶层
    /// \param deletable 族文件被载入后是否可被删除，当值为false时，即使调用DestroyFamilyService方法也不会删除该文件对应的族服务对象
    /// \return 返回是否成功
    bool GM_FAMILY_SERVICE_EXPORT LoadFamilyFile(const std::wstring& familyServiceUid, const std::wstring& familyFilePath, bool isParentDocumentNested = false, bool deletable = true);
}

